17613
24933
Який найшвидший спосіб перетворити java.nio.ByteBuffer a на (щойно створений) CharBuffer b або char [] b.
Роблячи це, важливо, щоб a [i] == b [i]. Це означає, що не a [i] та a [i + 1] разом складають значення b [j], а те, що би робив getChar (i), але значення слід «розповсюджувати».
байт a [] = {1,2,3, 125,126,127, -128, -127, -126} // кожен байт (які підписані)
char b [] = {1,2,3, 125,126,127, 128, 129, 130} // кожен символ char (які не мають підпису)
Зверніть увагу, що байт: -128 має ті самі (8 нижчих) бітів, що і char: 128. Тому я припускаю, що "найкраща" інтерпретація буде такою, як я зазначив вище, оскільки біти однакові.
Після цього мені також потрібен переклад навпаки: Найефективніший спосіб повернути char [] або java.nio.CharBuffer назад у java.nio.ByteBuffer. 
Отже, що ви хочете, це конвертувати за допомогою кодування ISO-8859-1.
Я нічого не стверджую щодо ефективності, але принаймні це досить коротко:
Результат CharBuffer = Charset.forName ("ISO-8859-1"). Декодування (byteBuffer);
Іншим напрямком буде:
Результат ByteBuffer = Charset.forName ("ISO-8859-1"). Encode (charBuffer);
Будь ласка, виміряйте це з іншими рішеннями. (Чесно кажучи, частину Charset.forName не слід включати, а також робити це лише один раз, а не для кожного буфера знову.)
З Java 7 також існує клас StandardCharsets із попередньо інстанційованими екземплярами Charset, тому ви можете використовувати
Результат CharBuffer = StandardCharsets.ISO_8859_1.decode (byteBuffer);
і
Результат ByteBuffer = StandardCharsets.ISO_8859_1.encode (charBuffer);
замість цього. (Ці рядки виконують те саме, що і раніше, просто пошук простіший, і немає ризику неправильно вводити імена і не потрібно вловлювати неможливі винятки.)
|
Я б погодився з @ Ishtar's, пропоную взагалі уникати перетворення на нову структуру і конвертувати лише за потребою.
Однак якщо у вас є купа ByteBuffer, ви можете це зробити.
ByteBuffer bb = ...
байт [] масив = bb.array ();
char [] chars = новий char [bb.remaining ()];
for (int i = 0; i